package portal.ejb;

import integracion.converters.entidades.Resultado;

import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

import javax.ejb.Stateful;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.PersistenceException;

import org.apache.log4j.Logger;

import portal.entities.Compra;
import portal.entities.Item;
import portal.entities.Producto;
import portal.entities.Usuario;
import portal.enums.EstadoCompraEnum;
import portal.excepciones.EliminarObjetoException;
import portal.vo.ItemVO;
import portal.vo.UsuarioVO;
import remotos.ComprasLogistica;
import remotos.LogsLogistica;

/**
 * Session Bean implementation class AdministradorUsuariosBean
 */
@Stateful
public class AdministradorCarritosBean implements AdministradorCarritos {
	
	private static Logger logger = Logger.getLogger(AdministradorCarritosBean.class);
	
	@PersistenceContext(unitName = "PortalDeComprasDB")
    EntityManager em;
	
	private Usuario usuario;
	List<ItemVO> items;

	@Override
	public void inicializar(UsuarioVO usuarioVO) {
		usuario = new Usuario();
		usuario.setVO(usuarioVO);
		
		items = new ArrayList<ItemVO>();
		
	}

	@Override
	public void agregarItem(ItemVO item) {
		items.add(item);
		LogsLogistica.logMessage("El usuario - " + this.usuario.getNombre() + " - del Portal Web 10 ha agregado el producto - " + item.getItemProducto().getNombre() + " - a su Carrito");
		
	}

	@Override
	public void eliminarItem(Long idProducto) throws EliminarObjetoException{
		
		ItemVO item = null;
		Iterator<ItemVO> it = items.iterator();
		boolean found = false;
		while (it.hasNext() && !found) {
			item = (ItemVO) it.next();
			found = (item.getItemProducto().getId().longValue() == idProducto.longValue());
				
		}
		if (found) {
	        it.remove();
	        LogsLogistica.logMessage("El usuario - " + this.usuario.getNombre() + " - del Portal Web 10 ha quitado el producto - " + item.getItemProducto().getNombre() + " - de su Carrito");
	    }
	}
	
	@Override
	public ItemVO buscarItem(Long idProducto) {
		ItemVO item = null;
		boolean found = false;
		Iterator<ItemVO> it = items.iterator();
		while (it.hasNext() && !found) {
			item = (ItemVO) it.next();
			found = (item.getItemProducto().getId().longValue() == idProducto.longValue());	
		}
		if(!found)return null;
		else return item;
	}
	
	@Override
	public void actualizarCantidadItem(Long idProducto, int cant) {
		ItemVO item = null;
		 int i = 0;
	     for (Iterator<ItemVO> it = items.iterator(); it.hasNext(); i++) {
	            item = (ItemVO)it.next();
	            if(item.getItemProducto().getId().longValue() == idProducto.longValue()){
	            	items.get(i).setCantidad(item.getCantidad() + cant);
	            	LogsLogistica.logMessage("El usuario - " + this.usuario.getNombre() + " - del Portal Web 10 ha aumentado en " + cant +" la cantidad del producto - " + item.getItemProducto().getNombre() + " - de su Carrito");
	            }
	     }
		
	}


	@Override
	public List<ItemVO> getListaItems() {
		return items;
	}

	@Override
	public void eliminar() {
		this.items = null;
		
	}
	
	
	private void setItemsCompra(Compra compra, List<ItemVO> listVO) {
		for (ItemVO itemVO : listVO) {
			Item item = new Item();
			item.setVO(itemVO);

			Long productoId = itemVO.getItemProducto().getId();
			Producto producto = em.find(Producto.class, productoId);
			item.setItemProducto(producto);

			compra.addItem(item);
		}
	}
	
	@Override
	public void confirmarCompra(){
		
		Compra cObj = new Compra();
		
		try
		{
			//guardar la compra en mi base
			
			cObj.setEstadoCompra(EstadoCompraEnum.A_CONFIRMAR.toString());
			cObj.setUsuarioCompra(usuario);
			cObj.setFechaCompra(new Date());
//			List<Item> itemsOjb = convVo.getListaEntityFromVo(items);
//			cObj.setItems(itemsOjb);
			setItemsCompra(cObj, items);
			em.persist(cObj);
			
			
		
//			//informo la compra
			ComprasLogistica cl = new ComprasLogistica();
//			boolean exitosa = cl.informarCompra(cObj, usuario);//aca le tengo que pasar la compra
			
			Resultado resultado = cl.enviarCompraALogistica(cObj.getVO());
			
			//System.out.println("Resultado: " + resultado.getEstado());
			
			//registro lo que me devuelve
			if("OK".equalsIgnoreCase(resultado.getEstado()))
				cObj.setEstadoCompra(EstadoCompraEnum.CONFIRMADA.toString());
			else
				cObj.setEstadoCompra(EstadoCompraEnum.NO_EXITOSO.toString());
			
			
						
			
			//todo termino bien, lo logueo
			
			LogsLogistica.logMessage("El usuario - " + this.usuario.getNombre() + " - del Portal Web 10 ha cerrado su Compra Exitosamente");
			
					
		
		}
		catch(PersistenceException pe){
			
			//mi log interno...
			logger.error("Error interno al persistir la compra");
			logger.error(pe);
			
			//log de logistica y monitoreo
			LogsLogistica.logMessage("Error al persistir la compra");
			LogsLogistica.logMessage("El usuario - " + this.usuario.getNombre() + " - del Portal Web 10 ha cerrado su Compra con Errores");
		}
		catch(Exception ex){
			//hago el rollback
			cObj.setEstadoCompra(EstadoCompraEnum.NO_EXITOSO.toString());
			
			//mi log interno...
			logger.error("Error externo al confirmar la compra");
			logger.error(ex);
			
			//log de logistica y monitoreo
			LogsLogistica.logMessage("El usuario - " + this.usuario.getNombre() + " - del Portal Web 10 ha cerrado su Compra con Errores");
		}
				
		
		this.items.clear();
		
	}

    
}
